with Coordinates;
use Coordinates;
with Generic_Sorted_List;
with Ada.Strings.Unbounded;
use Ada.Strings.Unbounded;

---------------------------------------------------------
-- Parts paketet. Definerar parts typen samt de        --
-- funktioner och procedurer som krävs för att skapa   --
-- en lista med parts. Förälderpaket till paketet      --
-- parts.operations som tar hand om parts-listan och   --
-- de operationer som kan göras på parts.              --
---------------------------------------------------------
package Parts is


   ---------------------------------------------------------
   -- Definera Coordinate_list som är den lista som       --
   -- innehåller de koordinater som en part består av.    --
   ---------------------------------------------------------
   package Coordinate_List is new Generic_Sorted_List(Data_Type => Coordinate_Type,
                                                       Key_Type => Integer,
                                                       Get_Key => Coordinates.Get_Key);
   use Coordinate_List;

   type Position_And_Movement_Type is
      record
         R : Integer := 0;
         X : Integer := 0;
         Y : Integer := 0;
         Z : Integer := 0;
         Coords_List : Coordinate_List.List_Pointer;
      end record;

   type Position_Array is array (1..500) of Position_And_Movement_Type;

--   type Part_Type is private;



   ---------------------------------------------------------
   -- Själva part typen.                                  --
   -- Part_Nr används för att identifiera en viss part    --
   -- Coordinates är den lsita med koordinater som en     --
   -- part består av.                                     --
   -- Part_Pos är en array som innehåller alla de möjliga --
   -- rotationerna en part kan ha.                        --
   ---------------------------------------------------------
    type Part_Type is
      record
         Part_Nr : Integer;
         X, Y, Z : Integer;
         Possible_Solution_Index : Integer := 1;
         Number_Of_Possible_Positions : Integer := 0;
         Coordinates : Coordinate_List.List_Pointer;
         Part_Pos : Position_Array; --Storleken kan ändras när vi kommit längre...
      end record;



   ---------------------------------------------------------
   -- Jämförelseoperationer som krävs för att kunan skapa --
   -- en parts-lista.                                     --
   ---------------------------------------------------------
   function "<"(Left, Right : in Part_Type) return Boolean;
   function ">"(Left, Right : in Part_Type) return Boolean;
   function "="(Left, Right : in Part_Type) return Boolean;

   ---------------------------------------------------------
   -- Funktion som används för listoperationer.           --
   -- Tar en part som inparameter och returnerar nummret  --
   -- som unikt identifierar en part.                     --
   ---------------------------------------------------------
   function Get_Key(Part : in Part_Type) return Integer;

   ---------------------------------------------------------
   -- Put procedure som krävs för att listan skall kunna  --
   -- skapas och som kan vara bra att ha vid testning.    --
   ---------------------------------------------------------
   procedure Put(Item : in Part_Type);

   ---------------------------------------------------------
   function Get_Pos_Array(Part : in Part_Type) return Position_Array;


function Expand_Coordinate_List(Partial_Figure : in Coordinate_List.List_Pointer;
                                   Coords : in Coordinate_List.List_Pointer)
                                  return Coordinate_List.List_Pointer;
   ---------------------------------------------------------
  -- procedure Put_Pos_Array(Part : in Part_Type);

private

end Parts;

